loginApi().then(res => {
  res.powerCode == 1 超级管理员
  res.powerCode == 2 普通管理员
  存到localStorage 和vuex一份
})

  < script src = "https://lib.baomitu.com/jquery/1.12.4/jquery.js" ></script >
    2 设置全局的路由拦截器
router.beforeEach((to, from, enxt) => {
  // 请求路由表信息
  getRoutesApi(vuex中身份状态码).then(res => {
    // res--返回的路由表 
    res----[{ name: "Home", path: "/home", Component: 'home' },
    { name: "Home", path: "/home", Component: 'home'，meta: { title: "首页", icon: "home" } },
    { name: "Home", path: "/home", Component: 'home' },
    ]
    res.forEach(item => {
      // router.addRoutes(res)//1整体的 添加路由表
      router.addRoute(item)
    })
    // 用返回的理由表 动态生成菜单

  })
})

// 菜单鉴权2 
// 根据当前登录的用户的id 获取用户信息
getuserInfo(用户id).then(res => {
  res--{
    username: "",
      // 权限表的单词
      permissions: ["home", 'about', 'user', 'department', 'role']
  }
})


路由拦截器
router.beforeEach((to, from, next) => {
  // 获取当前的路由表 --
  const routes = router.getRoutes()
  routes.foreEach(item => {
    if (item.name.includes(rulesList)) {
      router.addRouet(item)
    }

  })
})

// 按钮级别权限

loginApi().then(res => {
  res.powerCode == 1 超级管理员
  res.powerCode == 2 普通管理员、
  存到localStorage 和vuex一份
})
  // 
  < el - button  v - hasPerms > 删库跑路</el - button >
    < el - button  v - power > 增加合伙人</el - button >

      // 按钮权限 封装成自定义指令 方便复用
      Vue.directive('hasPerms', {
        bind () { },
        inserted (el, binding) {
          if (vuex中存储的权限是1) {
            el.style.display = 'block'
          } else {
            el.style.display = 'none'
          }
        },
        update () { },
        componentUpdated () { },
        unbind () { }
      })
{/* vue3的自定义指令 */ }
app.directive('hasPerms', {
  created () { },
  beforeMount () { },
  mounted (el, binding) {
  },
  beforeUpdate () { },
  updated () { },
  beforeUnmount () { },
  unmounted () { }
})


vue3的diff
 A C B E 
 旧的节点 做一个映射表
{
  A: 0,
    c: 1,
      B: 2,
        E: 3
}
{/* 根据映射表 来操作新的集合的移动和新增删除，减少不必要的操作 */ }
更少的 DOM 操作
复用最长递增子序列，避免不必要的移动
保持最优更新策略，提高性能

vuex - persistedstate
'pinia-plugin-persistedstate

js的伪数组
document.querySelectorAll() //--元素集合
function(...obj) {
  arguments["参数1", "参数2"]
}
      set 伪数组

Arrary.from() 转为真正的数组

headers: {
  'Content-Type': 'application/json', { name: 1, age: 2 }
  'Authorization': 'Bearer ' + token，

}
Expires: "过期时间",
  Cache - Control: true

ETag: "1", // 服务器返回的标识
  Last - Modified: "最后修改时间"


Object.prototype.toString.call()
Object.prototype.toString.call([1, 2, 3]) === '[Object Array]' 数组
[Object Function]函数
[Object Null]
[Object String]
[Object Object]

function Car () {
  this.say = funtion(){ }
}
Arrry.isArray()
HTMLCollection--类数组
Arrry.from()
arr.splice(4, 2, "你好", "萨法")、
@click="say"
let say = () => { }\
class Promise {


  static all () {

  }
}
{/* Promise.all([ajax()  ,axios() ,promise.reslove])
[{},{},{}] */}

Vue.component("组件", 组件)
  < h1 > {{ msg }}</h1 >

    render: (h) => {
      return h("div"，{ class: '', style: key }, [])
    }
vue2 加载全局插件
Vue.use(插件，{ 插件的配置项 })
Vue.prototype.名字 = 插件


vue的实例构造器的方法叫什么
创建一个可以new的组件
let CarCom = Vue.extend({
  data () { },
  methods: {},
  props: {
    msg: {
      type: String,
      default: "默认值"
    }
  }
})
let car1 = new CarCom({
  propsData: {
    msg: "你好"
  }
})
let car2 = new CarCom({
  propsData: {
    msg: "世界"
  }
})

nodejs 模块 
path 模块  路径管理模块
fs 模块 文件系统模块
http 模块 服务器模块
express 模块 web框架
cookie模块
body - parser 模块 解析post传参的模块
session 模块  存储数据的模块
mongoose 模块  操作数据库的模块


面包屑 导航
根据当前路由跳转菜单的匹配项
this.$route.matched =====> [{ name: "Home" }]


用过低代码开发吗
用过若依


你自己是怎么搭建项目的
  vite  vue - cli

  用  vue - admin - template 模版搭建、
  用 若依开发
